class ClockClass {
    static apply(ls) {
        let clock = new ClockClass(ls);
    }
    constructor(ls) {
        this.init(ls);
    }
    init(ls) {
        this.dom = `<div id="clock" class="light" >
<div class="switch-theme"></div>
<div class="display">
<div class="weekdays"></div>
<div class="ampm"></div>
<div class="alarm"></div>
<div class="digits"></div>
</div>
</div>`;
        /*<audio id="alarm-ring" preload>
<source src="./../base/clock/ticktac.mp3" type="audio/mpeg" />
</audio>*/
        // top = top || document.body;
        // $(top).append($(this.dom));
        let top = ls.addDom(this.dom,'clock',dom => {
            dom.style.right = '0';
            dom.style.left = 'unset';
        });
        initClock(top);
    }
}

function initClock(dom,cb) {
    cb = cb || (() => {});
    $(function(){
        // Cache some selectors
        var clock = $(dom).find('#clock'),
            ampm = clock.find('.ampm');
        // Map digits to their names (this will be an array)
        var digit_to_name = 'zero one two three four five six seven eight nine'.split(' ');
        // This object will hold the digit elements
        var digits = {};
        // Positions for the hours, minutes, and seconds
        var positions = [
            'h1', 'h2', ':', 'm1', 'm2', ':', 's1', 's2'
        ];
        // Generate the digits with the needed markup,
        // and add them to the clock
        var digit_holder = clock.find('.digits');
        $.each(positions, function(){

            if(this == ':'){
                digit_holder.append('<div class="dots">');
            }
            else{

                var pos = $('<div>');

                for(var i=1; i<8; i++){
                    pos.append('<span class="d' + i + '">');
                }

                // Set the digits as key:value pairs in the digits object
                digits[this] = pos;

                // Add the digit elements to the page
                digit_holder.append(pos);
            }

        });
        // Add the weekday names
        var weekday_names = 'MON TUE WED THU FRI SAT SUN'.split(' '),
            weekday_holder = clock.find('.weekdays');
        $.each(weekday_names, function(){
            weekday_holder.append('<span>' + this + '</span>');
        });
        var weekdays = clock.find('.weekdays span');
        // Run a timer every second and update the clock
        (function update_time(){
            // Use moment.js to output the current time as a string
            // hh is for the hours in 12-hour format,
            // mm - minutes, ss-seconds (all with leading zeroes),
            // d is for day of week and A is for AM/PM
            var now = moment().format("hhmmssdA");
            digits.h1.attr('class', digit_to_name[now[0]]);
            digits.h2.attr('class', digit_to_name[now[1]]);
            digits.m1.attr('class', digit_to_name[now[2]]);
            digits.m2.attr('class', digit_to_name[now[3]]);
            digits.s1.attr('class', digit_to_name[now[4]]);
            digits.s2.attr('class', digit_to_name[now[5]]);
            // The library returns Sunday as the first day of the week.
            // Stupid, I know. Lets shift all the days one position down,
            // and make Sunday last
            var dow = now[6];
            dow--;
            // Sunday!
            if(dow < 0){
                // Make it last
                dow = 6;
            }
            // Mark the active day of the week
            weekdays.removeClass('active').eq(dow).addClass('active');
            // Set the am/pm text:
            ampm.text(now[7]+now[8]);
            // Schedule this function to be run again in 1 sec
            setTimeout(update_time, 1000);
        })();
        // Switch the theme
        $('#clock .switch-theme').click(function(){
            clock.toggleClass('dark')
        });
        // window.clock = clock;
        cb(clock);
    });
}
